package com.hsgene.dict.persistence;


import com.hsgene.dict.condition.SysDictQueryCondition;
import com.hsgene.dict.dto.SysDictDto;
import com.hsgene.dict.dto.SysDictSaveDto;
import org.apache.ibatis.annotations.Param;

import java.util.Date;
import java.util.List;
import java.util.Map;

public interface SysDictPersistence {

    /**
     * @param id 字典逻辑主键id
     * @return com.hsgene.dict.dto.SysDictDto
     * @description 根据id查询字典信息
     * @author maodi
     * @createDate 2018/11/29 9:24
     */
    SysDictDto select(@Param("id") String id);

    /**
     * @param id 字典逻辑主键id
     * @return java.lang.Integer
     * @description 根据id查询字典数量
     * @author maodi
     * @createDate 2018/11/29 15:06
     */
    Integer queryCountById(@Param("id") String id);

    /**
     * @param id   字典逻辑主键id
     * @param date 删除时间
     * @return void
     * @description 根据字典id删除字典
     * @author maodi
     * @createDate 2018/11/29 9:24
     */
    void delete(@Param("id") String id, @Param("updateDate") Date date);

    /**
     * @param ids  id数组
     * @param date 删除时间
     * @return void
     * @description 根据字典id数组批量删除字典
     * @author maodi
     * @createDate 2018/11/29 15:00
     */
    void deleteMulti(@Param("ids") String[] ids, @Param("updateDate") Date date);

    /**
     * @param sysDict 字典信息
     * @return void
     * @description 新增字典信息
     * @author maodi
     * @createDate 2018/11/29 9:25
     */
    void insert(SysDictSaveDto sysDict);

    /**
     * @param sysDict 字典信息
     * @return void
     * @description 修改字典信息
     * @author maodi
     * @createDate 2018/11/29 9:26
     */
    void update(SysDictSaveDto sysDict);

    /**
     * @param condition 查询条件
     * @return java.util.List<com.hsgene.dict.dto.SysDictDto>
     * @description 字典列表/条件查询字典列表
     * @author maodi
     * @createDate 2018/11/29 10:25
     */
    List<SysDictDto> queryDicts(SysDictQueryCondition condition);

    /**
     * @param condition 查询条件
     * @return java.lang.Integer
     * @description 查询字典数量/条件查询字典数量
     * @author maodi
     * @createDate 2018/11/29 9:27
     */
    Integer queryDictCount(SysDictQueryCondition condition);

    /**
     * @param id         字典逻辑主键id
     * @param type       字典类型
     * @param label      字典值
     * @param dictNameId 字典名称id
     * @return java.lang.Integer
     * @description 根据值查询字典信息数量/排除当前id根据值查询字典信息数量
     * @author maodi
     * @createDate 2018/11/29 14:13
     */
    Integer queryCountByValue(@Param("id") String id, @Param("type") String type, @Param("dictNameId") String
            dictNameId, @Param("label") String label);

    /**
     * @param
     * @return java.util.List<java.util.Map<java.lang.String,java.lang.Object>>
     * @description 获取字典所有分类
     * @author maodi
     * @createDate 2018/11/28 14:44
     */
    List<Map<String, Object>> queryAllClassifies();

    /**
     * @param id sys_dict_addtion的id
     * @return java.util.List<java.util.Map<java.lang.String,java.lang.Object>>
     * @description 根据字典名称id获取上级节点
     * @author maodi
     * @createDate 2018/11/28 14:43
     */
    List<Map<String, Object>> queryValuesByLabel(@Param("id") String id);

    /**
     * @param id 字典逻辑主键id
     * @return java.lang.Integer
     * @description 查询字典使用数量
     * @author maodi
     * @createDate 2018/11/29 14:07
     */
    Integer queryDictUsedCountById(@Param("id") String id);

    /**
     * @param id   字典逻辑主键id
     * @param date 修改时间
     * @return void
     * @description 增加一次字典使用数量
     * @author maodi
     * @createDate 2018/11/29 14:09
     */
    void addDictUsedCount(@Param("id") String id, @Param("updateDate") Date date);

    /**
     * @param id   字典逻辑主键id
     * @param date 修改时间
     * @return void
     * @description 减少一次字典使用数量
     * @author maodi
     * @createDate 2018/11/29 14:12
     */
    void reduceDictUsedCount(@Param("id") String id, @Param("updateDate") Date date);

    /**
     * @param ids  字典逻辑主键id数组
     * @param date 修改时间
     * @return void
     * @description 批量增加一次字典使用数量
     * @author maodi
     * @createDate 2018/11/29 14:09
     */
    void addMultiDictUsedCount(@Param("ids") String[] ids, @Param("updateDate") Date date);

    /**
     * @param ids  字典逻辑主键id数组
     * @param date 修改时间
     * @return void
     * @description 批量减少一次字典使用数量
     * @author maodi
     * @createDate 2018/11/29 14:12
     */
    void reduceMultiDictUsedCount(@Param("ids") String[] ids, @Param("updateDate") Date date);

    /**
     * @param classifyId 分类id
     * @return java.util.List<java.util.Map<java.lang.String,java.lang.Object>>
     * @description 根据字典分类id获取字典名称下拉框数据源
     * @author maodi
     * @createDate 2018/12/3 15:13
     */
    List<Map<String, Object>> queryLabelsByClassifyId(@Param("classifyId") String classifyId);

    /***
     * 根据字典名称查询所有字典
     * @author jcl
     * @date 2018/12/4 16:01
     * @param dictAddtionId 字典名称的id
     * @return
     */
    List<SysDictDto> valueByDictAddtionId(@Param("dictAddtionId") String dictAddtionId);

    /**
     * 根据ids获取列表
     *
     * @param split
     * @return
     * @author FX
     * @date 2018/12/5 10:49
     */
    List<SysDictDto> selectByIds(@Param("split") String[] split);

    /**
     * @param label      字典值
     * @param dictNameId 字典名称id
     * @param type       分类名称
     * @return java.lang.String
     * @description 新增时根据label, dict_name_id, type获取是否有被删除的数据
     * @author maodi
     * @createDate 2018/12/5 15:30
     */
    String queryBylabelAndDictNameIdAndType(@Param("label") String label, @Param("dictNameId") String dictNameId, @Param
            ("type") String type);

    /**
     * @param id         逻辑主键id
     * @param createBy   创建人
     * @param createDate 创建时间
     * @param updateBy   修改人
     * @param updateDate 修改时间
     * @return void
     * @description
     * @author maodi
     * @createDate 2018/12/5 15:47
     */
    void recoveryData(@Param("id") String id, @Param("createBy") String createBy, @Param("createDate") Date createDate,
                      @Param("updateBy") String updateBy, @Param("updateDate") Date updateDate);

    /**
     * @param id 分类id
     * @return java.lang.String
     * @description 根据分类id查询分类名称
     * @author maodi
     * @createDate 2018/12/5 15:45
     */
    String queryClassfyNameByClassfyId(@Param("id") String id);
}